<?php
namespace app\service;
error_reporting(E_ALL);
ini_set('display_errors', 1);
use think\facade\Config;
use app\exception\ParameterException;
class PlacardService
{
  protected $wxAppID;
    protected $wxAppSecret;
    protected $wxAccessTokenUrl;

    function __construct(){
        // 初始化微信小程序的AppID、AppSecret和获取access_token的URL
//        $this->wxAppID = config('wx.app_id');
//        $this->wxAppSecret = config('wx.app_secret');
//        $this->wxAccessTokenUrl = sprintf(config('wx.access_token_url'),$this->wxAppID,$this->wxAppSecret);

        $this->wxAppID = Config::get('wechat.AppID');
        $this->wxAppSecret= Config::get('wechat.AppSecret');
        $this->wxAccessTokenUrl = sprintf(Config::get('wechat.access_token_url'),$this->wxAppID,$this->wxAppSecret);

    }

    /**
     * 获取微信小程序二维码
     *
     * @param string $type 默认为'qrcode'，表示生成普通二维码；如果为'bgqrcode'，则表示生成带背景图的二维码
     * @return array 返回一个包含成功与否、状态码、数据和错误信息的数组
     */
    public function createQrcode($type = 'qrcode')
    {
        $mid=request()->_mid;
        $code = request()->_invitationCode;
        $path = "pages/register/register?m=".$code;
        $scene = "m=".$code;
        if($type == "bgqrcode" && file_exists('upload/qr/bgqrcode/'.$mid.'.jpg')){
            return request()->domain()."/upload/qr/bgqrcode/{$mid}.jpg";
        }
        try {
            // 获取请求路径和场景参数
//            $path = input('path');
//            $scene = input('scene');
            // 获取微信access_token
            $result=curl_get($this->wxAccessTokenUrl);

            // 将JSON格式的access_token信息转换为数组
            $wxResult = json_decode($result,true);

            // 如果获取access_token失败，返回错误信息
            if(empty($wxResult)){
                throw new ParameterException("获取access_token异常");

            }
            // 根据类型选择对应的微信接口URL
            if($type == 'qrcode'){
                $url = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=".$wxResult['access_token'];
            }else{
                $url = "https://api.weixin.qq.com/wxa/getwxacode?access_token=".$wxResult['access_token'];
            }
            // 准备请求数据
            $data = array(
                'path' => $path,
                'width' => 171
            );
            $data = json_encode($data);
            // 设置请求选项
            $options = array(
                'http' => array(
                    'header' => "Content-Type: application/json\r\n",
                    'method' => 'POST',
                    'content' => $data
                )
            );

            $context = stream_context_create($options);
            // 根据类型处理返回的二维码图片数据
            if($type == "bgqrcode"){
                $imageData = file_get_contents($url, false, $context);
                //$pathName = md5($path.$scene)  ;
                // 调用mergeQrcode方法将二维码图片与背景图合成
                $this->mergeQrcode($imageData,"upload/qr/{$type}/",$mid.'.jpg');
                return request()->domain()."/upload/qr/{$type}/{$mid}.jpg";
            }else{
                $imageData = file_get_contents($url, false, $context);
                //$pathName = md5($path.$scene)  ;
                // 直接保存二维码图片
                file_put_contents("upload/qr/{$type}/{$mid}.jpg", $imageData);
                return request()->domain()."/upload/qr/{$type}/{$mid}.jpg";
            }
        }catch (\Exception $e){
            throw new ParameterException($e->getMessage());
        }

    }

    /**
     * 将背景图和生成的小程序码合成一张图片
     *
     * @param string $qrcodeImg 二维码图片数据
     * @param string $savePath 保存路径
     * @param string $saveName 保存文件名
     * @return string 合成图片的保存路径和文件名
     */
    public function mergeQrcode($qrcodeImg,$savePath,$saveName)
    {

        //读取配置文件
        $syncConfig = (new SysIntroService())->getByMarkOne('invite');
        $syncConfig = $syncConfig->cover??'';

        $domain = request()->domain();
        //获取当前域名 https:// 判断http的话转https
        if (strpos($domain, 'http://') !== false) {
            $domain = str_replace('http://', 'https://', $domain);
        }

        $syncConfig = str_replace($domain.'/', '', $syncConfig);

        if (!file_exists($syncConfig)) {
            throw new ParameterException("背景图不存在: " . $syncConfig);
        }

        // 创建背景图和二维码图片资源
        $bgImg = imagecreatefromstring(file_get_contents($syncConfig));

        $qrcodeImg = imagecreatefromstring($qrcodeImg);

        // 调整二维码图片大小
        $qrcodeImg = imagescale($qrcodeImg, 171, 171);
        // 获取背景图和二维码图片的尺寸
        $bgImgWidth = imagesx($bgImg);
        $bgImgHeight = imagesy($bgImg);
        $qrcodeImgWidth = imagesx($qrcodeImg);
        $qrcodeImgHeight = imagesy($qrcodeImg);
        // 设置二维码图片在背景图上的位置
        $qrcodeImgX = 200;
        $qrcodeImgY = abs(359 - $bgImgHeight);
        // 将二维码图片合成到背景图上
        imagecopymerge($bgImg, $qrcodeImg, $qrcodeImgX, $qrcodeImgY, 0, 0, $qrcodeImgWidth, $qrcodeImgHeight, 100);
        // 如果保存路径不存在，则创建路径
        if(!is_dir($savePath)){
            mkdir($savePath,0777,true);
        }
        // 保存合成后的图片
        imagejpeg($bgImg,$savePath.$saveName);
        // 释放资源
        imagedestroy($bgImg);
        imagedestroy($qrcodeImg);
        // 返回合成图片的保存路径和文件名
        return $savePath.$saveName;
    }

}
